Bug 153567 – Repaint glitches in widgets
authorCody Russell <bratsche@gnome.org>
Mon, 21 Jul 2008 12:46:41 +0000 (12:46 +0000)
committerCody Russell <bratsche@src.gnome.org>
Mon, 21 Jul 2008 12:46:41 +0000 (12:46 +0000)
2008-07-21  Cody Russell  <bratsche@gnome.org>

        Bug 153567 – Repaint glitches in widgets

        * gdk/win32/gdkevents-win32.c: Set a sync timer when
        we receive WM_SYNCPAINT, and RedrawWindow() once
        the timer expires.

svn path=/trunk/; revision=20881

ChangeLog
gdk/win32/gdkevents-win32.c

index 57b20ed613f397dcfeec005faf8aa76648edb11b..3ff3e8ebd369815c03cee134b345b3197f03e5be 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2008-07-21  Cody Russell  <bratsche@gnome.org>
+
+       Bug 153567 – Repaint glitches in widgets
+
+       * gdk/win32/gdkevents-win32.c: Set a sync timer when
+       we receive WM_SYNCPAINT, and RedrawWindow() once
+       the timer expires.
+
 2008-07-21  Michael Natterer  <mitch@imendio.com>
 
        * gtk/gtktoolbar.c (gtk_toolbar_class_init): use the simpler
index 6633f5920824ede81e3e2d5dc0cea83b349f9427..6e3565469137b9841cec1413ded7aea2172457e2 100644 (file)
@@ -139,6 +139,7 @@ static HKL latin_locale = NULL;
 
 static gboolean in_ime_composition = FALSE;
 static UINT     modal_timer;
+static UINT     sync_timer = 0;
 
 static int debug_indent = 0;
 
@@ -2031,14 +2032,31 @@ handle_stuff_while_moving_or_resizing (void)
 
 static VOID CALLBACK
 modal_timer_proc (HWND     hwnd,
-                  UINT     msg,
-                  UINT     id,
-                  DWORD    time)
+                 UINT     msg,
+                 UINT     id,
+                 DWORD    time)
 {
   if (_sizemove_in_progress)
     handle_stuff_while_moving_or_resizing ();
 }
 
+static VOID CALLBACK
+sync_timer_proc (HWND hwnd,
+                UINT msg,
+                UINT id,
+                DWORD time)
+{
+  MSG message;
+  if (PeekMessageW (&message, hwnd, WM_PAINT, WM_PAINT, PM_REMOVE))
+    {
+      return;
+    }
+
+  RedrawWindow (hwnd, NULL, NULL, RDW_INVALIDATE|RDW_UPDATENOW|RDW_ALLCHILDREN);
+
+  KillTimer (hwnd, sync_timer);
+}
+
 static void
 handle_display_change (void)
 {
@@ -2824,6 +2842,13 @@ gdk_event_translate (MSG  *msg,
       *ret_valp = 1;
       break;
 
+    case WM_SYNCPAINT:
+
+      sync_timer = SetTimer (GDK_WINDOW_HWND (window),
+                            1,
+                            200, sync_timer_proc);
+      break;
+
     case WM_PAINT:
       handle_wm_paint (msg, window, FALSE, NULL);
       break;